/**
 * @file   main.cpp
 * @author Pedro Jimenez
 * @date   Fri Nov 14 16:06:58 2008
 * 
 * @brief  Program to read stereo videos in raw format from file and visualize.
 * 
 * 
 */
#include <iostream>
#include <string.h>

#include <stdlib.h>
#include <stdio.h>

#include <sys/time.h>
#include <unistd.h>
#include <sys/select.h>

#include "options.h"
#include <colores.h>
#include "other_functions.h"

//#include "read_video_thread.h"
#include "read_jpegvideo_thread.h"

///Names of the openCV image display windows
char window_names[2][100] = { "Left", "Right"};


int main(int argc, char *argv[])
{ 
    int i;
    int numcams=0;

   /// inicialize the command line params
    if (!leer_opciones(argc, argv))
	return 0;

    //objeto que se encarga de leer las imágenes. 
    //se inicializa con un buffer de 100 frames
    //CRead_Video_Thread reader(ini_opt("buffers"));
    CRead_jpegVideo_Thread reader(ini_opt("buffers"));

    int wait = ini_opt("speed"), key=0;
    unsigned int next_frame = ini_opt("iniframe");

    ///inicialize the video params
    if (reader.init_params(ini_opts("v"), ini_opts("format"), next_frame))
	return -1;

    //lanza el hilo de lectura de las imágenes
    if (!reader.start())
    {
	printf("error en la lectura de los videos.\n");
	return -1;
    }

    numcams = reader.numcams();
    for (i=0; i<numcams; i++)
    {
	cvNamedWindow(window_names[i], 1);
    } 

    ///main visualizing loop
    do
    {
	///get next image from the buffer
	fflush(stdout);
	//Cstereo_IplImage *img = reader.consumer();
	Cjpeg_IplImage *img = reader.consumer();
	if (!img) //check if there are more frames
	    break;

	/// and display
	for (i=0; i<numcams; i++)
	    cvShowImage(window_names[i], reader.img(i));

	printf("%d\n", reader.get_last_used()->n);
	//read keyboard
	while ((key=bucle_cvWaitKey(&wait)) > 0)
	    ;

    } while (key >= 0);
    
    fflush(stdout);
    return 0;
}


/** 
 * @brief command line options
 */
struct option2 mainopts2[]= {
    {{"v", 1, NULL, OPT_VAL_IS_CHAR}, 0, "", 
     "Video to process"},
    {{"speed", 1, NULL, OPT_VAL_IS_INT}, 0, "", 
     "tIndicates de inicial display speed: 1: fast, 9: slow, 0:stooped(default)"},
    {{"format", 1, NULL, OPT_VAL_IS_CHAR}, 0, "", 
     "format = [raw | ra2 | avi]: Tells the format of the video"},
    {{"cam", 0, NULL, true}, false, "", 
     "Capture de video from the cameras"},
    {{"iniframe", 1, NULL, OPT_VAL_IS_INT}, 0, "",
     "inidica el frame de inicio"},
    {{"buffers", 1, NULL, OPT_VAL_IS_INT}, 200, "",
     "Numero de buffers a usar para la lectura del disco de los videos."},
    {{"width", 1, NULL, OPT_VAL_IS_INT}, 0, "", 
     "Ancho (x) de la imágen, en píxeles. 0 para valor predeterminado del video"},
    {{"height", 1, NULL, OPT_VAL_IS_INT}, 0, "", 
     "Alto (y) de la imágen, en píxeles. 0 para valor predeterminado del video"},
    {{"offsetx1", 1, NULL, OPT_VAL_IS_INT}, -1, "", 
     "desplazamiento horizontal (en x)  de la imágen de la cámara izquierda, en píxeles. 0 centrar la ROI"},
    {{"offsety1", 1, NULL, OPT_VAL_IS_INT}, -1, "", 
     "desplazamiento vertical (en y)  de la imágen de la cámara izquierda, en píxeles. 0 centrar la ROI"},
    {{"offsetx2", 1, NULL, OPT_VAL_IS_INT}, -1, "", 
     "desplazamiento horizontal (en x)  de la imágen de la cámara derecha, en píxeles. 0 centrar la ROI"},
    {{"offsety2", 1, NULL, OPT_VAL_IS_INT}, -1, "", 
     "desplazamiento vertical (en y)  de la imágen de la cámara derecha, en píxeles. 0 centrar la ROI"},

    {{"options", 0, NULL, true}, false, "", 
     "Imprime las opciones de configuracion del programa"},
    {{"h", 0, NULL, true}, false, "", 
     "Muestra las opciones que se pueden indicar por línea de comandos"},
    {{"help", 0, NULL, true}, false, "", 
     "Muestra esta ventana de ayuda"},
    {{NULL, 0, NULL, 0}, 0, "", 
     ""}
};
